package com.springboot.service.system;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.auth0.jwt.JWT;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.springboot.config.error.MySpringBootException;
import com.springboot.dao.SystemMenuDao;
import com.springboot.dao.UserLoginDao;
import com.springboot.dao.UserLoginJwtDao;
import com.springboot.entity.UserLoginJwtEntity;
import com.springboot.returndata.dto.AddUpdateUserDto;
import com.springboot.returndata.dto.GetUserListDto;
import com.springboot.returndata.dto.UserLoginDto;
import com.springboot.entity.UserLoginEntity;
import com.springboot.jwt.config.JwtUtil;
import com.springboot.jwt.dto.JWTHeaderDto;
import com.springboot.jwt.dto.JWTPayload;
import com.springboot.returndata.vo.ResourceAuthMenuVo;
import com.springboot.returndata.vo.UserLoginVo;
import com.springboot.type.SystemUserType;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.springboot.util.common.MyDateUtil;
import com.springboot.util.enums.RespErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import jakarta.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author zyj
 * @since 2021-04-01
 */
@Service
@Slf4j
public class UserLoginService extends ServiceImpl<UserLoginDao, UserLoginEntity> {

	@Resource
	private UserLoginDao userLoginEntityMapper;

	@Resource
	private UserLoginJwtDao userLoginJwtDao;

	@Resource
	private SystemMenuDao systemMenuDao;

	@Autowired
	private JwtUtil jwtUtil;

	@Value("${project.jwt_token}")
	private int tokenTime;

	/**
	 * @param userLoginDto
	 * @return java.lang.String
	 * @Description 登录获取token
	 * @Author zyj
	 * @Date 2021/4/1 11:33
	 **/
	public String login(UserLoginDto userLoginDto) throws Exception {
		/**校验验证码*/
//		Object captcha = getSessionValue("captcha");
//		if(ObjectUtil.isEmpty(captcha)){
//			throw new MySpringBootException(RespErrorCode.VERI_CODE_NULL.getValue(), RespErrorCode.VERI_CODE_NULL.getDescripe());
//
//		}
//
//		String vertiCode = captcha.toString().toLowerCase();
//		//比较时先删除验证码
//		removeSessionValue("captcha");
//		if(!vertiCode.equals(userLoginDto.getCaptcha())){
//			throw new MySpringBootException(RespErrorCode.VERI_CODE_NULL.getValue(), RespErrorCode.VERI_CODE_NULL.getDescripe());
//		}

		/**step1: 判断用户名密码*/
        UserLoginEntity userLoginEntity = userLoginEntityMapper.findByUserLoginName(userLoginDto.getUserLoginName());
        log.info("login用户信息查询-userLoginEntity:{}",userLoginEntity);
        if(null == userLoginEntity){
        	throw new MySpringBootException(RespErrorCode.USER_NULL.getValue(), RespErrorCode.USER_NULL.getDescripe());
        }
		boolean passCheck = DigestUtil.bcryptCheck(userLoginDto.getUserPassword(), userLoginEntity.getUserPassword());
		if(!passCheck){
	        throw new MySpringBootException(RespErrorCode.USER_NULL.getValue(), RespErrorCode.USER_NULL.getDescripe());
        }


        /**step2: 生成token*/
		Date date = new Date();
		JWTPayload jwtPayload = new JWTPayload();
		String [] userIds = new String[]{String.valueOf(userLoginEntity.getUserId())};
		jwtPayload.setAud(userIds);
		jwtPayload.setExp(MyDateUtil.getLocalTimeAfter(tokenTime));
		jwtPayload.setNbf(date);
		jwtPayload.setIat(date);
		jwtPayload.setJti(userLoginEntity.getUserLoginName());
		String token = jwtUtil.jwtCreate(new JWTHeaderDto(), jwtPayload, userLoginEntity.getUserPassword());

		/**保存有效期*/
		UserLoginJwtEntity userLoginJwtEntity = new UserLoginJwtEntity();
		userLoginJwtEntity.setJwt(token);
		userLoginJwtEntity.setUserId(userLoginEntity.getUserId());
		userLoginJwtEntity.setEndTime(MyDateUtil.getLocalTimeAfter(tokenTime));
		userLoginJwtDao.insert(userLoginJwtEntity);


		return token;
	}


	/**
	 * description: 退出登录
	  * @param jwt
	 * @return: String
	 * @author: zyj
	 * @date: 2023/3/9
	 */
	public void loginOut(String jwt) throws Exception {

		/**校验验jwt*/
		if(ObjectUtil.isEmpty(jwt)){
			throw new MySpringBootException(RespErrorCode.USER_NULL.getValue(), RespErrorCode.USER_NULL.getDescripe());

		}
		String userId = JWT.decode(jwt).getAudience().get(0);
		userLoginJwtDao.deleteByJwtAndUserId(userId, jwt);
	}


	/**
	 * description:
	 * @param getUserListDto
	 * @return: Page<UserLoginVo>
	 * @author: zyj
	 * @date: 2023/3/2
	 */
	public Page<UserLoginVo> getUserList(GetUserListDto getUserListDto){
		Page<UserLoginVo> userList = userLoginEntityMapper.getUserList(getUserListDto.getPage(), getUserListDto);
		return userList;
	}


	/**
	 * description: 获取所有接口按钮权限
	  * @param pMenuCode
	 * @return: List<ResourceAuthMenuVo>
	 * @author: zyj
	 * @date: 2023/3/3
	 */
	public List<ResourceAuthMenuVo> getAuthMenuByParent(String pMenuCode){
		return systemMenuDao.getAuthMenuByParent(pMenuCode);
	}

	/**
	 * 新增用户
	 * @param addUpdateUserDto
	 */
	public void addUser(AddUpdateUserDto addUpdateUserDto){
		UserLoginEntity userLoginEntity = new UserLoginEntity();
		userLoginEntity.setUserLoginName(addUpdateUserDto.getUserName());
		String hashPwd = DigestUtil.bcrypt(addUpdateUserDto.getPassWord());
		userLoginEntity.setUserPassword(hashPwd);
		userLoginEntity.setUserType(SystemUserType.type_normal);

		userLoginEntityMapper.insert(userLoginEntity);
	}


	/**
	 * 更新用户
	 * @param addUpdateUserDto
	 */
	public void updateUser(AddUpdateUserDto addUpdateUserDto){
		String hashPwd = DigestUtil.bcrypt(addUpdateUserDto.getPassWord());
		addUpdateUserDto.setPassWord(hashPwd);
		userLoginEntityMapper.updateUserById(addUpdateUserDto);
	}

	/**
	 * 删除用户
	 * @param userId
	 */
	public void deleteUser(Integer userId){
		userLoginEntityMapper.deleteById(userId);
	}
}

